BERT-of-Theseus:基于模块替换的模型压缩方法
©PaperWeekly 原创 · 作者|苏剑林
学校|追一科技
研究方向|NLP、神经网络
模型压缩
简单来说,模型压缩就是“简化大模型,得到推理速度更快的小模型”。当然,一般来说模型压缩是有一定牺牲的,比如最明显的是最后的评测指标会有一定的下降,毕竟“更好又更快”的免费午餐是很少的,所以选择模型压缩的前提是能允许一定的精度损失。
其次,模型压缩的提速通常只体现在预测阶段,换句话说,它通常需要花费更长的训练时间,所以如果你的瓶颈是训练时间,那么模型压缩也不适合你。
模型压缩要花费更长时间的原因是它需要“先训练大模型,再压缩为小模型”。读者可能会疑惑:为什么不直接训练一个小模型?答案是目前很多实验已经表明,先训练大模型再压缩,相比直接训练一个小模型,最后的精度通常会更高一些。
1.2 常见手段
常见的模型压缩技术可以分为两大类:1)直接简化大模型得到小模型;2)借助大模型重新训练小模型。这两种手段的共同点是都先要训练出一个效果比较好的大模型,然后再做后续操作。
第一类的代表方法是剪枝(Pruning)和量化(Quantization)。
剪枝,顾名思义,就是试图删减掉原来大模型的一些组件,使其变为一个小模型,同时使得模型效果在可接受的范围内;
至于量化,指的是不改变原模型结构,但将模型换一种数值格式,同时也不严重降低效果,通常我们建立和训练模型用的是 float32 类型,而换成 float16 就能提速且省显存,如果能进一步转换成 8 位整数甚至 2 位整数(二值化),那么提速省显存的效果将会更加明显。
第二类的代表方法是蒸馏(Distillation)。蒸馏的基本想法是将大模型的输出当作小模型训练时的标签来用,以分类问题为例,实际的标签是 one hot 形式的,大模型的输出(比如 logits)则包含更丰富的信号,所以小模型能从中学习到更好的特征。
Theseus
本文将要介绍的压缩方法称为“BERT-of-Theseus”,属于上面说的两大类压缩方法的第二类,也就是说它也是借助大模型来训练小模型,只不过它是基于模块的可替换性来设计的。
2.1 核心思想
举个实际的类比:
假设现在有 A、B 两支球队,每支各五人。A 球队属于明星球队,实力超群;B 球队则是新手球队,待训练。为了训练 B 球队,我们从 B 球队中选 1 人,替换掉 A 球队中的 1 人,然后让这个“4+1”的A球队不断的练习、比赛。经过一段时间,新加入的成员实体会提升,这个“4+1”的球队就拥有接近原始 A 球队的实力。
回到BERT的压缩,现在假设我们有一个 6 层的 BERT,我们直接用它在下游任务上微调,得到一个效果还不错的模型,我们称之为 Predecessor(前辈)。
在 BERT-of-Theseus 的整个流程中,Predecessor 的权重都被固定住。6 层的 Predecessor 被分为 3 个模块,跟 Successor 的 3 层模型一一对应,训练的时候,随机用 Successor 层替换掉 Predecessor 的对应模块,然后直接用下游任务的优化目标进行微调(只训练 Successor 的层)。
2.3 方法分析
跟蒸馏相比,BERT-of-Theseus 有什么优势呢?首先,这既然能被发表出来,所以至少效果应该是不相上下的,所以我们就不去比较效果了,而是比较方法本身。很明显,BERT-of-Theseus 的主要特点是:简洁。
前面说到,蒸馏多数时候也需要匹配中间层输出,这时候要涉及到的训练目标就有很多了:下游任务 loss、中间层输出 loss、相关矩阵 loss、Attention 矩阵 loss、等等,想想要平衡这些 loss 就是一件头疼的事情。
相比之下,BERT-of-Theseus 直接通过替换这个操作,逼着 Successor 能有跟 Predecessor 类似的输出,而最终的训练目标就只有下游任务 loss,不可谓不简洁。
此外,BERT-of-Theseus 还有一个特别的优势:很多的蒸馏方法都得同时作用于预训练和微调阶段,效果才比较突出,而 BERT-of-Theseus 直接作用于下游任务的微调,就可以得到相媲美的效果。这个优势在算法上体现不出来,属于实验结论。
从形式上来看,BERT-of-Theseus 的随机替换思路有点像图像中的数据扩增方案 SamplePairing 和 mixup(参考《从 SamplePairing到mixup:神奇的正则项》[4] ),都是随机采样两个对象加权求和来增强原模型;也有点像 PGGAN [5] 的渐进式训练方案,都是通过对两个模型进行某种程度的混合,实现两个模型的过渡。
邱震宇老兄也分享了自己的讲解 [6] 以及基于原版 BERT 的 Tensorflow 实现 qiufengyuyi/bert-of-theseus-tf [7]。当然,既然笔者决定写这篇介绍,那就肯定少不了基于 bert4keras 的 Keras 实现了:
https://github.com/bojone/bert-of-theseus
这大概是目前最简洁、最具可读性的 BERT-of-Theseus 实现了,没有之一。
可以看到,相比直接拿前几层微调,BERT-of-Theseus 确实能带来一定的性能提升。对于随机置零方案,除了均等概率选择 0/1 外,原论文还尝试了其他策略,有轻微提升,但会引入额外超参,所以笔者就没有实验了,有兴趣的读者可以自己修改尝试。
另外,对于蒸馏来说,如果 Successor 跟 Predecessor 有同样的结构(同模型蒸馏),那么通常来说 Successor 的最终性能比 Predecessor 还要好些,BERT-of-Theseus 有没有这一特点呢?
参考文献
[1] https://github.com/bojone/bert4keras
[2] https://arxiv.org/abs/2002.11794
[3] https://www.zhihu.com/question/303922732
[4] https://kexue.fm/archives/5693
[5] https://arxiv.org/abs/1710.10196
[6] https://zhuanlan.zhihu.com/p/112787764
[7] https://github.com/qiufengyuyi/bert-of-theseus-tf
更多阅读
#投 稿 通 道#
让你的论文被更多人看到
如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。
总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。
PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得或技术干货。我们的目的只有一个,让知识真正流动起来。
📝 来稿标准:
• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)
• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接
• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志
📬 投稿邮箱:
• 投稿邮箱:hr@paperweekly.site
• 所有文章配图,请单独在附件中发送
• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。